﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using AbcCorp.BLO;

namespace AbcCorp.AccountService
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IAccountService
    {
        /// <summary>
        /// Đăng nhập
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <param name="password">Mật khẩu</param>
        /// <returns>Tài khoản (Account)</returns>
        [FaultContract(typeof(Account))]        
        [OperationContract]
        Account SignIn(string username, string password);

        /// <summary>
        /// Đăng ký
        /// </summary>
        /// <param name="newAccount">Thông tin tài khoản mới</param>
        /// <returns>Giá trị âm nếu thất bại, ngược lại nếu thành công</returns>
        [FaultContract(typeof(Account))]
        [OperationContract]
        bool SignUp(Account newAccount);

        /// <summary>
        /// Lấy lại mật khẩu
        /// </summary>
        [FaultContract(typeof(Account))]
        [OperationContract]
        string GetPassword(string username, string email);

        /// <summary>
        /// Thay đổi mật khẩu
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <param name="email">Email</param>
        /// <param name="password">Mật khẩu cũ</param>
        /// <param name="newpassword">Mật khẩu mới</param>
        [FaultContract(typeof(Account))]
        [OperationContract]
        bool UpdatePassword(string username, string email, string password, string newpassword);

        /// <summary>
        /// Thay đổi mật khẩu khi người dùng sử dụng chức năng lấy lại mật khẩu
        /// </summary>
        /// <param name="code">Mã người dùng nhận được khi eyeeu cầu lấy lại mật khẩu</param>
        /// <param name="newPassword">Mật khẩu mới</param>
        [FaultContract(typeof(Account))]
        [OperationContract]
        bool UpdatePasswordByCode(string code, string newPassword);

        /// <summary>
        /// Lấy mã tài khoản
        /// </summary>
        /// <param name="username">Tài khoản</param>
        /// <returns>Mật khẩu (string)</returns>
        [FaultContract(typeof(Account))]
        [OperationContract]
        int GetAccountId(string username);
    }

    // Use a data contract as illustrated in the sample below to add composite types to service operations
    [DataContract]
    public class Account
    {
        /// <summary>
        /// Mã tài khoản
        /// </summary>
        [DataMember]
        public int AccountID { get; set; }

        /// <summary>
        /// Tên đăng nhập
        /// </summary>
        [DataMember]
        public string Username { get; set; }

        /// <summary>
        /// Mật khẩu
        /// </summary>
        [DataMember]
        public string Password { get; set; }

        /// <summary>
        /// Địa chỉ
        /// </summary>
        [DataMember]
        public string Address { get; set; }

        /// <summary>
        /// Ngày sinh
        /// </summary>
        [DataMember]
        public DateTime Birthday { get; set; }

        /// <summary>
        /// Địa chỉ email
        /// </summary>
        [DataMember]
        public string Email { get; set; }

        /// <summary>
        /// Họ
        /// </summary>
        [DataMember]
        public string Fname { get; set; }

        /// <summary>
        /// Tên
        /// </summary>
        [DataMember]
        public string Lname { get; set; }

        /// <summary>
        /// Số điện thoại
        /// </summary>
        [DataMember] 
        public string Phone { get; set; }

        /// <summary>
        /// Giới tính
        /// </summary>
        [DataMember]
        public bool Sex { get; set; }

        /// <summary>
        /// User hiện tại có phải là admin hay không
        /// </summary>
        [DataMember]
        public bool IsAdmin { get; set; }
    }
}
